Learn in 10 minutes

Learn in 10 minutes

Aprende Lua en 10 minutos

Lua es un lenguaje de programación superligero, perfecto para incrustar en otras aplicaciones. ¿Sabías que se usa en juegos como ‘World of Warcraft’ y Roblox? También es popular para scripts de configuración.

1. Tu primer programa en Lua

Vamos a empezar por lo básico. Crea un archivo hello.lua y escribe:

print("Hello, World!")

Guárdalo y ejecuta en la terminal:

lua hello.lua

Verás:

Hello, World!

¡Mira qué fácil! print() muestra texto en pantalla.

2. Sintaxis básica

La sintaxis de Lua es super simple:

-- Esto es un comentario de una línea
print("¡Hola Mundo!")

--[[
Esto es un comentario
de múltiples líneas
]]

Puntos importantes:

  • Comentarios: Una línea --, múltiples --[[ ]]
  • Sentencias: Una por línea, sin punto y coma
  • Mayúsculas: Lua distingue mayúsculas y minúsculas
  • Espacios: Espacios y saltos de línea no importan

3. Variables y tipos de datos

Lua es de tipado dinámico, no declares tipos:

-- Asignación directa
nombre = "Lua"
edad = 25
increible = true
pi = 3.14159

-- Asignación múltiple
x, y, z = 10, 20, 30

-- Valor nulo es nil
vacio = nil

print("Nombre:", nombre)
print("Edad:", edad)
print("Increíble?:", increible)

Tipos de datos en Lua:

  • nil: Sin valor
  • boolean: true o false
  • number: Números (enteros y decimales)
  • string: Cadenas de texto
  • table: Estructura de datos universal de Lua
  • function: Funciones (ciudadanos de primera clase)
  • userdata: Para C
  • thread: Corrutinas

4. Manipulación de strings

-- Crear strings
str1 = "Hola"
str2 = 'Mundo'
str3 = [[Multilínea
texto fácil]]

-- Concatenar con ..
mensaje = str1 .. " " .. str2
print(mensaje)  -- Salida: Hola Mundo

-- Longitud con #
longitud = #"Hola"
print(longitud)   -- Salida: 4

-- Métodos de string
texto = "hello world"
mayusculas = texto:upper()
minusculas = texto:lower() 
subcadena = texto:sub(1, 5)

print(mayusculas)    -- Salida: HELLO WORLD
print(subcadena)      -- Salida: hello

5. Tablas - El contenedor universal

Las tablas son lo mejor de Lua:

-- Como array (índices desde 1)
frutas = {"manzana", "banana", "cereza"}
print(frutas[1])  -- Salida: manzana
print(frutas[2])  -- Salida: banana

-- Como diccionario
persona = {
    nombre = "Juan",
    edad = 30,
    ciudad = "Madrid"
}
print(persona.nombre)    -- Salida: Juan
print(persona["edad"])  -- Salida: 30

-- Mixto también funciona
tablaMixta = {
    "manzana",
    "banana", 
    color = "rojo",
    cantidad = 5
}

-- Operaciones con tablas
frutas = {"manzana", "banana"}
table.insert(frutas, "cereza")  -- Añadir al final
table.insert(frutas, 2, "naranja") -- Insertar en posición

print(table.concat(frutas, ", "))  -- Salida: manzana, naranja, banana, cereza

6. Estructuras de control

-- If
edad = 18

if edad >= 18 then
    print("Eres adulto")
elseif edad >= 13 then
    print("Eres adolescente")
else
    print("Eres niño")
end

-- While
contador = 1
while contador <= 5 do
    print("Contador:", contador)
    contador = contador + 1
end

-- For numérico
for i = 1, 5 do
    print("Número:", i)
end

-- For con paso
for i = 10, 1, -2 do
    print("Cuenta atrás:", i)
end

-- For para tablas
frutas = {"manzana", "banana", "cereza"}
for indice, fruta in ipairs(frutas) do
    print(indice, fruta)
end

persona = {nombre = "Juan", edad = 30}
for clave, valor in pairs(persona) do
    print(clave, valor)
end

7. Funciones

-- Función básica
function saludar(nombre)
    return "Hola, " .. nombre .. "!"
end

mensaje = saludar("Maria")
print(mensaje)  -- Salida: Hola, Maria!

-- Múltiples return
function calcular(a, b)
    return a + b, a - b, a * b, a / b
end

suma, resta, producto, division = calcular(10, 5)
print("Suma:", suma)        -- Salida: Suma: 15
print("Resta:", resta) -- Salida: Resta: 5

-- Función anónima (lambda)
multiplicar = function(x, y)
    return x * y
end

resultado = multiplicar(4, 5)
print(resultado)  -- Salida: 20

-- Funciones como parámetros
function ejecutarOperacion(x, y, operacion)
    return operacion(x, y)
end

resultado = ejecutarOperacion(6, 7, multiplicar)
print(resultado)  -- Salida: 42

8. Módulos

Organiza el código en módulos. Crea matematicas.lua:

-- matematicas.lua
local Matematicas = {}

function Matematicas.sumar(a, b)
    return a + b
end

function Matematicas.multiplicar(a, b)
    return a * b
end

return Matematicas

Usalo en el archivo principal:

-- principal.lua
local matematicas = require("matematicas")

resultado = matematicas.sumar(10, 5)
print("Suma resultado:", resultado)  -- Salida: Suma resultado: 15

resultado = matematicas.multiplicar(4, 6)
print("Multiplicación resultado:", resultado)  -- Salida: Multiplicación resultado: 24

9. Manejo de errores

-- Capturar errores con pcall
function operacionPeligrosa()
    error("¡Algo salió mal!")
end

-- pcall llama de forma protegida
exito, resultado = pcall(operacionPeligrosa)

if exito then
    print("Éxito:", resultado)
else
    print("Fallo:", resultado)
end

-- Errores personalizados
function dividir(a, b)
    if b == 0 then
        error("División por cero no permitida")
    end
    return a / b
end

exito, resultado = pcall(dividir, 10, 0)
if not exito then
    print("Error:", resultado)
end

10. Ejemplos prácticos

-- Calculadora simple
function calculadora()
    print("🐮 Calculadora Simple")
    print("1. Sumar")
    print("2. Restar") 
    print("3. Multiplicar")
    print("4. Dividir")
    
    opcion = tonumber(io.read())
    print("Primer número:")
    num1 = tonumber(io.read())
    print("Segundo número:")
    num2 = tonumber(io.read())
    
    if opcion == 1 then
        resultado = num1 + num2
        print("Resultado:", resultado)
    elseif opcion == 2 then
        resultado = num1 - num2
        print("Resultado:", resultado)
    elseif opcion == 3 then
        resultado = num1 * num2
        print("Resultado:", resultado)
    elseif opcion == 4 then
        if num2 ~= 0 then
            resultado = num1 / num2
            print("Resultado:", resultado)
        else
            print("❌ División por cero")
        end
    else
        print("🤔 Opción inválida")
    end
end

-- Para usar, quita el comentario
-- calculadora()

-- Operaciones de archivo
function leerArchivo(nombreArchivo)
    local archivo = io.open(nombreArchivo, "r")
    if not archivo then
        return nil, "No se puede abrir el archivo"
    end
    
    local contenido = archivo:read("*a")
    archivo:close()
    return contenido
end

contenido, error = leerArchivo("ejemplo.txt")
if contenido then
    print("Contenido:", contenido)
else
    print("Error:", error)
end

Conclusión

¡Lua es genial! Perfecto para:

  • 🎮 Scripting de juegos (muchos juegos lo usan)
  • 🔧 Desarrollo embebido (por su ligereza)
  • ⚙️ Archivos de configuración y automatización
  • 🚀 Escenarios de alto rendimiento (con LuaJIT)

Lo mejor de Lua:

  • Superligero: Ocupa poco espacio
  • Rápido: LuaJIT es ultra rápido
  • Flexible: Tipado dinámico + tablas universales
  • Portable: Funciona en móviles y servidores
  • Fácil de incrustar: Se lleva bien con C/C++

¿Quieres aprender más? Prueba:

  • Librería estándar de Lua
  • Corrutinas (programación concurrente)
  • Metatables y metamethdos (para OOP)
  • API de C de Lua
  • Love2D para desarrollo de juegos

¡Lua es fácil de aprender y muy potente! 🚀